package org.study.aop.core;


import org.study.aop.bean.AopBeanDefinition;
import org.study.ioc.core.BeanFactoryImp;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 产生代理对象的工厂类，通过继承ioc容器的BeanFactoryImp，重写getBean方法，
 * 如果是一个切面代理类就使用aop框架来生成代理类
 * 如果是普通类就用ioc
 */
public class AopBeanFactoryImpl extends BeanFactoryImp {
    private static final ConcurrentHashMap<String, AopBeanDefinition> aopBeanDefinitionMap = new ConcurrentHashMap<String, AopBeanDefinition>();
    //存放aop代理对象的集合
    private static final ConcurrentHashMap<String, Object> aopBeanMap = new ConcurrentHashMap<String, Object>();

    @Override
    public Object getBean(String beanName) throws Exception {
        Object object = aopBeanMap.get(beanName);
        if (object != null) {
            return object;
        }
        if (aopBeanDefinitionMap.containsKey(beanName)) {
            //从aop容器中获取
            AopBeanDefinition aopBeanDefinition = aopBeanDefinitionMap.get(beanName);
            //todo 还未完成，这里需要对代理处理，设计一套代理模式来执行增强的方法(调用前置执行，调用后置执行等)
        }
        return super.getBean(beanName);
    }
    //注册一个bean,也就是把aopBean 存入map中
    protected void registerBean(String name, AopBeanDefinition aopBeanDefinition){
        aopBeanDefinitionMap.put(name,aopBeanDefinition);
    }
    //private AdvisedSupport
}
